侧边栏切换

verilog的两个小技巧 动态截取 与 位复制

最后编辑于: 2022-09-13 15:35  |  分类: 电子  |  标签: FPGA verilog   |  浏览数: 2914  |  评论数: 0


1. +: 和 -: 动态位截取

位截取经常用到, 我们一般是使用诸如vt[7:2]这样的形式, 位边界都是常量.

如果想要位边界是变量 以实现动态截取呢, 如果我们这样写 vt[cnt+4:cnt](cnt是变量), 是编译通不过的.

正确的语法应该这样写:

vt[base+:width] or vt[base-:width]

其中, base可以是变量, width必须是常量.

也即是说, 起始位可以是变量, 位宽必须是常量.

这样上面想当然的错误写法, 可以写为vt[cnt+:4].

if cnt=5, vt[cnt+:4] 等于 vt[8:5]; vt[cnt-:4] 等于 vt[5:2].

不知为何, 这个用法应该是挺常用的, 但在很多verilog教材中都没有提及, 但在verilog标准中是有的哦.

2. 大括号{}的复制功能

大括号{}的拼接功能, 大家都知道了, 比如下面这种

{a, b[3:0], c, 3'b100}

就不多说了.

{{}}表示复制, 这个用法就不常用了, 但有些场景用起来还是挺方便的.

比如: {4{a}}等同于{a,a,a,a}, {12{1'b1}}等同于12'b1111_1111_1111

当然, 拼接复制 也可以组合起来使用, 比如:

{a, {3{a,b}}}

上一篇: lwip之ip层实现

下一篇: uclinux多线程应用-串口与网络通信